package cn.openea.perpartner.meily.rabbit.service.impl.group;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.openea.perpartner.common.core.exception.ServiceException;
import cn.openea.perpartner.common.core.utils.DateUtils;
import cn.openea.perpartner.meily.constant.SystemConstants;
import cn.openea.perpartner.meily.rabbit.domain.GroupDto;
import cn.openea.perpartner.meily.rabbit.service.impl.PublisherService;
import cn.openea.perpartner.meily.thirdparty.BpmSystemApi;
import cn.openea.perpartner.meily.thirdparty.payment.PointsSystemApi;
import cn.openea.perpartner.meily.web.entity.Goods;
import cn.openea.perpartner.meily.web.entity.GroupBuying;
import cn.openea.perpartner.meily.web.entity.GroupBuyingSub;
import cn.openea.perpartner.meily.web.service.IBuyingRecordService;
import cn.openea.perpartner.meily.web.service.IGoodsService;
import cn.openea.perpartner.meily.web.service.IGroupBuyingService;
import cn.openea.perpartner.meily.web.service.IGroupBuyingSubService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;

/**
 * @author rains
 * @since 2023-06-26 12:15
 */
@Slf4j
@Component
public class GroupConsumerService {

    @Resource
    private PointsSystemApi pointsSystemApi;
    @Resource
    private BpmSystemApi bpmSystemApi;
    @Resource
    private SystemConstants systemConstants;
    @Autowired
    PublisherService publisherService;
    @Resource
    private IGroupBuyingService groupBuyingService;
    @Resource
    private IGroupBuyingSubService groupBuyingSubService;
    @Resource
    private IBuyingRecordService buyingRecordService;
    @Resource
    private IGoodsService goodsService;

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 团购消费业务队列
     * 自动收货前48小时发送收货通知、到期自动收货
     * @param object
     * @param deliveryTag
     * @param channel
     * @throws IOException
     */
    @RabbitListener(queuesToDeclare ={@Queue(name = "group.queue",durable = "true",autoDelete = "false",exclusive = "false")})
    public void receiveGroup(JSONObject object, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) throws IOException {

        System.out.println("************************************");
        System.out.println("开始团购消息消费....");

        GroupDto dto = JSON.toJavaObject(object, GroupDto.class);

        /**
         * dto = {
         *      type: 0,// 用于区分具体业务的类型
         *      object = {
         *         id: 团购购买记录id
         *     }
         * }
         * type说明:
         * 0：自动收货前48小时发送收货通知；
         * 1：到期自动收货；
         */
        JSONObject obj = dto.getParams();// 业务相关数据
        if(BeanUtil.isEmpty(obj) || StrUtil.isBlank(obj.getString("id"))){
            log.error("获取不到业务数据，执行结束（出错中断）！");
            log.info("********************************");
            return;
        }
        try {

            String id = obj.getString("id");// 团购购买记录id
            String type = dto.getType();// 用于区分具体业务的类型

            // 自动收货前48小时发送收货通知
            if("0".equals(type)){
                sendConfirmReceiptMsg(id);
            } else if("1".equals(type)){
                // 自动收货
                autoConfirmReceipt(id);
            }

            // 消息消费成功，手动确认消息,消息从队列中删除
            channel.basicAck(deliveryTag, false);

        } catch (Exception e) {
            log.error(e.getMessage());
            // 消息消费失败，手动拒绝消息,消息从队列中删除
            channel.basicNack(deliveryTag, false, false);
        }
    }

    /**
     * 自动收货前48h给消费者发送确认收货通知
     * @param id
     * @return
     */
    public boolean sendConfirmReceiptMsg(String id) throws ParseException {

        log.info("********************************");
        log.info("开始执行：自动收货前48h给消费者发送确认收货通知....");

        // 1.购买记录
        GroupBuyingSub groupBuyingSub = groupBuyingSubService.getById(id);
        if(BeanUtil.isEmpty(groupBuyingSub)){
            log.error("根据购买记录id（" + id + "）获取不到购买记录！");
            log.info("执行结束（出错中断）！");
            log.info("********************************");
            return false;
        }

        // 2.判断是否为“已发货”的状态，如果不是，则无需继续处理
        if(!"已发货".equals(groupBuyingSub.getOrderStatus())){
            log.error("此购买记录（" + id + "）的状态不为“已发货”，不需要发送通知！");
            log.info("执行结束！");
            log.info("********************************");
            return true;
        }

        // 3.到期时间不等于当前时间，则需要重新入队
        System.out.println("当前时间=" + DateUtil.now());
        System.out.println("到期时间=" + groupBuyingSub.getExpirationTime());
        System.out.println("到期前48小时=" + DateUtils.addDays(sdf.parse(groupBuyingSub.getExpirationTime()), -2));
        System.out.println("到期时间等于当前时间? : " + DateUtils.isSameDay(sdf.parse(DateUtil.now()), DateUtils.addDays(sdf.parse(groupBuyingSub.getExpirationTime()), -2)));

        if(!DateUtils.isSameDay(sdf.parse(DateUtil.now()), DateUtils.addDays(sdf.parse(groupBuyingSub.getExpirationTime()), -2))) {
            System.out.println("**********************");
            System.out.println("48小时前提醒收货：需重新入队。当前时间：" + DateUtil.now());

            // 业务参数
            JSONObject object = new JSONObject();
            object.put("id", id);

            GroupDto dto = new GroupDto();
            Long ttl = DateUtil.betweenMs(sdf.parse(DateUtil.now()), DateUtils.addDays(sdf.parse(groupBuyingSub.getExpirationTime()), -2)); // 自动收货前48小时
            dto.setDelayTime(ttl); // 自动收货前48小时
            dto.setType("0");// 类型。0：自动收货前48小时发送收货通知；
            dto.setParams(object);
            // 48小时提醒收货
            publisherService.execute(dto);
            return true;

        } else {

            System.out.println("**********************");
            System.out.println("到期执行给消费者发放收货通知。当前时间：" + DateUtil.now());

            HashMap<String, Object> params = new HashMap<>();
            params.put("first", "您的订单剩余48小时自动确认收货！");
            params.put("keyword1", groupBuyingSub.getTaskNumber());// 订单编号
            params.put("keyword2", groupBuyingSub.getGoodsName());// 商品名称
            params.put("remark", "点击查看订单详情。平台现有大量零食/美妆/洗护/母婴/百货等商品销售资源，佣金非常可观，欢迎前往选品！");
            params.put("pagepath", "/pages_private_scene2/GroupPurchase/OrderDetails?recordId=" + groupBuyingSub.getId());// （链接到【订单详情】）
            params.put("pageurl", "/pages_private_scene2/GroupPurchase/OrderDetails?recordId=" + groupBuyingSub.getId());// （链接到【订单详情】）
            params.put("docUnid", groupBuyingSub.getId());
            params.put("userId", groupBuyingSub.getPartnerId());
            JSONObject resObject = bpmSystemApi.sendHttp(params, systemConstants.getMsgWfNum());
            if (resObject.isEmpty() || !"200".equals(resObject.getString("code"))) {
                log.error("自动收货前48h给消费者【" + groupBuyingSub.getPartnerName() + "(" + groupBuyingSub.getPartnerId() + ")" + "】发送确认收货通知失败！");
                log.error("执行结束（出错中断）！");
                log.info("********************************");
                return false;
            }
        }

        log.info("执行成功！");
        log.info("********************************");
        return true;
    }

    /**
     * 到期自动收货
     * 步骤：
     *  1.先判断到期时间是否与当前时间一致，若不一致则表示延长收货了，需要重新入队；
     *  2.
     * @param id
     * @return
     */
    public boolean autoConfirmReceipt(String id) throws ParseException {

        log.info("********************************");
        log.info("开始执行：平台自动收货....");

        // 1.购买记录
        GroupBuyingSub groupBuyingSub = groupBuyingSubService.getById(id);
        if(BeanUtil.isEmpty(groupBuyingSub)){
            log.error("根据购买记录id（" + id + "）获取不到购买记录！");
            log.info("执行结束（出错中断）！");
            log.info("********************************");
            return false;
        }

        // 2.判断是否为“已发货”的状态，如果不是，则无需继续处理
        if(!"已发货".equals(groupBuyingSub.getOrderStatus())){
            log.error("此购买记录（" + id + "）的状态不为“已发货”，不需要执行自动收货！");
            log.info("执行结束！");
            log.info("********************************");
            return true;
        }

        // 3.到期时间不等于当前时间，则需要重新入队
        System.out.println("当前时间=" + DateUtil.now());
        System.out.println("到期时间=" + groupBuyingSub.getExpirationTime());
        System.out.println("到期前48小时=" + DateUtils.addDays(sdf.parse(groupBuyingSub.getExpirationTime()), -2));
        System.out.println("到期时间等于当前时间? : " + DateUtils.isSameDay(sdf.parse(DateUtil.now()), DateUtils.addDays(sdf.parse(groupBuyingSub.getExpirationTime()), -2)));

        if(!DateUtils.isSameDay(sdf.parse(DateUtil.now()), sdf.parse(groupBuyingSub.getExpirationTime()))){

            System.out.println("**********************");
            System.out.println("自动收货：需重新入队。当前时间：" + DateUtil.now());

            // 业务参数
            JSONObject object = new JSONObject();
            object.put("id", id);

            GroupDto dto = new GroupDto();
            Long ttl = DateUtil.betweenMs(sdf.parse(DateUtil.now()), sdf.parse(groupBuyingSub.getExpirationTime())); // 自动收货前48小时
            dto.setDelayTime(ttl);
            dto.setType("1");// 类型。1：到期自动收货；
            dto.setParams(object);

            // 自动收货
            publisherService.execute(dto);
            return true;

        } else {

            System.out.println("**********************");
            System.out.println("执行自动收货。当前时间：" + DateUtil.now());

            /**
             * 第1步 修改订单状态为"已完成"
             */
            LambdaUpdateWrapper<GroupBuyingSub> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(GroupBuyingSub::getId, id);
            updateWrapper.eq(GroupBuyingSub::getOrderStatus, "已发货");
            // 修改订单状态为：已完成
            updateWrapper.set(GroupBuyingSub::getOrderStatus, "已完成");// 状态
            updateWrapper.set(GroupBuyingSub::getReceivingTime, DateUtils.getNow());// 收货时间
            updateWrapper.set(GroupBuyingSub::getUpdateTime, DateUtils.getNow());// 更新时间
            if (!groupBuyingSubService.update(updateWrapper)) {
                log.error("平台自动收货出错了，出错记录：" + id);
                log.error("执行结束！");
                log.info("********************************");
            }

            /**
             * 第2步 给消费者发送自动收货通知
             */
            // 1.商品信息
            Goods goods = goodsService.getById(groupBuyingSub.getGoodsId());
            if (goods == null || BeanUtil.isEmpty(goods)) {
                log.error("根据商品id（" + groupBuyingSub.getGoodsId() + "）获取不到商品信息，无法进行结算！");
                log.info("执行结束（出错中断）。");
                log.info("********************************");
            }

            /**
             * 2023-06-25 注释 by lys
             * 注释原因：
             *  暂不需要给消费者发放通知

             // 此拼团商品实际销量（不包含商品自定义销量）
             long totalSales = groupBuyingSubService.getTotalBuyQuantity(groupBuyingSub.getGoodsId(), groupBuyingSub.getCycle(), groupBuyingSub.getMainDocunid());

             // 商品自定义销量
             String customSales = goods.getCustomSales();
             if (StrUtil.isNotBlank(customSales) && Long.parseLong(customSales) > 0) {
             totalSales += Long.parseLong(customSales);
             }

             String consumerCashback = "";// 消费者返现金额
             String groupType = "";// 团购类型。百人团/千人团/万人团

             if (totalSales > 100 && totalSales <= 1000) {
             // 百人团
             consumerCashback = goods.getHundredConsumerCashback();
             groupType = "百人团";

             } else if (totalSales > 1000 && totalSales <= 10000) {
             // 千人团
             consumerCashback = goods.getThousandConsumerCashback();
             groupType = "千人团";

             } else if (totalSales > 10000) {
             // 万人团
             consumerCashback = goods.getTenThousandConsumerCashback();
             groupType = "万人团";
             }

             // 消费者团销返利总额 = 消费者团销返利 * 消费者自己购买数量 * 100.0
             double consumerReward = 0.0;
             if (StrUtil.isNotBlank(consumerCashback)) {
             consumerReward = Double.parseDouble(consumerCashback.trim()) * Double.parseDouble(groupBuyingSub.getBuyQuantity());
             }

             String first = "您的订单已自动确认收货。";

             if (consumerReward > 0) {
             first = "您的订单已自动确认收货，" + groupType + "返现" + String.format("%.2f", consumerReward) + "元已到账！";
             }
             HashMap<String, Object> params = new HashMap<>();
             params.put("first", first);
             params.put("keyword1", groupBuyingSub.getTaskNumber());// 订单编号
             params.put("keyword2", groupBuyingSub.getGoodsName());// 商品名称
             params.put("remark", "点击查看收益详情。平台现有大量零食/美妆/洗护/母婴/百货等商品销售资源，佣金非常可观，欢迎前往选品！");
             params.put("pagepath", "/pages_private_scene2/GroupPurchase/OrderDetails?recordId=" + groupBuyingSub.getId());// （链接到【订单详情】）
             params.put("pageurl", "/pages_private_scene2/GroupPurchase/OrderDetails?recordId=" + groupBuyingSub.getId());// （链接到【订单详情】）
             params.put("docUnid", groupBuyingSub.getId());
             params.put("userId", groupBuyingSub.getPartnerId());
             JSONObject resObject = bpmSystemApi.sendHttp(params, systemConstants.getMsgWfNum());
             if (resObject.isEmpty() || !"200".equals(resObject.getString("code"))) {
                 log.error("平台自动收货后给消费者【" + groupBuyingSub.getPartnerName() + "(" + groupBuyingSub.getPartnerId() + ")" + "】发送通知失败！");
                 log.error("执行结束！");
                 log.info("********************************");
             }*/

            /**
             * 第3步 给线上服务商发放分销报酬
             */
            // 获取拼团详情
            GroupBuying gb = groupBuyingService.getById(groupBuyingSub.getMainDocunid());
            if(BeanUtil.isNotEmpty(gb)){
                String buyQuantity = groupBuyingSub.getBuyQuantity();// 购买数量
                String distributionReward = gb.getDistributionReward();// 线上服务商分销报酬（原团长帮卖报酬）

                // 线上服务商分销报酬总额 = 线上服务商分销报酬 * 购买数量；
                double _reward = 0.0;

                // 需要增加的积分 = 线上服务商分销报酬总额 * 100.0
                double points = 0.0;
                if (StrUtil.isNotBlank(distributionReward) && StrUtil.isNotBlank(buyQuantity)) {
                    _reward = Double.parseDouble(distributionReward) * Double.parseDouble(buyQuantity);
                    points = _reward * 100.0;
                }

                if (_reward > 0) {

                    // 调用积分系统：转入钱包
                    JSONObject object1 = new JSONObject();
                    object1.put("userId", gb.getInitiatorId());// 团长（拼团发起人id）
                    object1.put("points", String.format("%.0f", points));// 保留0位小数
                    object1.put("reason", groupBuyingSub.getGoodsName() + "团购分销报酬，共" + String.format("%.2f", _reward) + "元");
                    JSONObject resObj = pointsSystemApi.subPayToWallet(object1);
                    if (resObj.isEmpty() || !"200".equals(resObj.getString("code"))) {
                        log.error("给线上服务商【" + gb.getInitiatorName() + "(" + gb.getInitiatorId() + ")" + "】发放分销报酬失败！购买记录：" + id);
                        log.error("执行结束！");
                        log.info("********************************");
                        throw new ServiceException("给线上服务商【" + gb.getInitiatorName() + "(" + gb.getInitiatorId() + ")" + "】发放分销报酬失败！购买记录：" + id);
                    }

                    /**
                     * 第4步 给线上服务商发放通知
                     */
                    HashMap<String, Object> params2 = new HashMap<>();
                    params2.put("first", groupBuyingSub.getPartnerName() + "已完成您分享的" + gb.getTitle() + "团购订单，您已获得" + String.format("%.2f", _reward) + "元工作报酬。");
                    params2.put("keyword1", gb.getTaskNumber());// 订单编号
                    params2.put("keyword2", groupBuyingSub.getGoodsName() + "*" + groupBuyingSub.getBuyQuantity() + " 共" + groupBuyingSub.getPayAmount() + "元");// 商品名称
                    params2.put("remark", "点击查看收益详情。温馨提示：多人参与您可获得多份销售报酬哦，您还可以尝试销售其他商品～");
                    params2.put("pagepath", "/pages/index/incomeIndex");// （链接到【收益页面】）
                    params2.put("pageurl", "/pages/index/incomeIndex");// （链接到【收益页面】）
                    params2.put("docUnid", gb.getId());
                    params2.put("userId", gb.getInitiatorId());
                    JSONObject object2 = bpmSystemApi.sendHttp(params2, systemConstants.getMsgWfNum());
                    if (object2.isEmpty() || !"200".equals(object2.getString("code"))) {
                        log.error("给线上服务商【" + gb.getInitiatorName() + "(" + gb.getInitiatorId() + ")" + "】发放分销报酬通知失败！购买记录：" + id);
                        log.error("执行结束！");
                        log.info("********************************");
                        throw new ServiceException("给线上服务商【" + gb.getInitiatorName() + "(" + gb.getInitiatorId() + ")" + "】发放分销报酬通知失败！购买记录：" + id);
                    }
                }

            } else if (groupBuyingSub.getGoodsId().equals(groupBuyingSub.getMainDocunid())) {
                // 如果 拼团主文档id = 商品记录唯一id，表示团长是平台，则不需要发放报酬
                log.info("此购买记录(" + groupBuyingSub.getId() + ")的团长是平台，无需给线上服务商发放报酬与通知！");
            }

            /**
             * 2023-06-25 注释 by lys
             * 注释原因：
             *  暂时不需要给消费者与线上服务商发放团销奖励与通知
             *
             * 第5步 已到期，结算团销奖励；
             *

             String currentCycle = goodsService.cycle(Long.parseLong(groupBuyingSub.getGoodsId()));// 当前周期
             boolean flag = false;// 当前周期是否大于历史周期。大于:true；小于:false；
             // 周期串如： 230052-1630915779874603010-1237643653
             if (StrUtil.isNotBlank(groupBuyingSub.getCycle()) && StrUtil.isNotBlank(currentCycle)) {
                 String whichCycle = groupBuyingSub.getCycle().split("-")[0];
                 String currentWhichCycle = currentCycle.split("-")[0];
                 if (Integer.parseInt(currentWhichCycle) > Integer.parseInt(whichCycle)) {
                     // 如果当前周期，大于历史周期，表示已经到了下个周期
                     flag = true;
                 }
             }
             if (currentCycle.equals(groupBuyingSub.getCycle()) && !flag) {
                 // 周期串一样，则表示周期未结束
                 log.info("商品周期未结束，无需发放团销奖励。");
             } else {
                 // 获取订单完成情况
                 JSONObject completionObject = groupBuyingSubService.getOrderCompletion(gb, gb.getDistributionReward());

                 // 线上服务商团销报酬总额 = 线上服务商团销返利金额 * 购买数量；
                 double online_reward = 0.0;

                 // 线上服务商团销报酬需要增加的积分 = 线上服务商分销报酬总额 * 100.0
                 double online_points = 0.0;

                 // 消费者团销报酬总额 = 消费者团销返利金额 * 购买数量；
                 double consumer_reward = 0.0;

                 // 消费者团销报酬总额需要增加的积分 = 消费者团销报酬总额 * 100.0
                 double consumer_points = 0.0;

                 // 计算消费者与线上服务商团销返利金额
                 if ("2".equals(gb.getStatus())) {

                     String consumerCashback = "";// 消费者返利金额
                     String onlineCashback = "";// 线上服务商返利金额
                     String groupType = "";// 团购类型。百人团/千人团/万人团

                     // 1.获取此拼团商品购买总数（不包含自定义商品）
                     // long totalBuyQuantity = getTotalBuyQuantity(gb.getGoodsId(), gb.getCycle(), gb.getId());
                     // 1.获取商品总销量 = 实际销量 + 商品自定义销量
                     GroupDto groupDto = new GroupDto();
                     groupDto.setGoodsId(groupBuyingSub.getGoodsId());
                     groupDto.setGoodsNo(groupBuyingSub.getGoodsNo());
                     groupDto.setCycle(groupBuyingSub.getCycle());
                     long totalBuyQuantity = buyingRecordService.getTotalSales(groupDto);

                     if (totalBuyQuantity >= 100) {

                         // 2.获取商品信息
                         if (totalBuyQuantity > 100 && totalBuyQuantity <= 1000) {
                             // 百人团
                             consumerCashback = goods.getHundredConsumerCashback();
                             onlineCashback = goods.getHundredOnlineCashback();
                             groupType = "百人团";

                         } else if (totalBuyQuantity > 1000 && totalBuyQuantity <= 10000) {
                             // 千人团
                             consumerCashback = goods.getThousandConsumerCashback();
                             onlineCashback = goods.getThousandOnlineCashback();
                             groupType = "千人团";

                         } else if (totalBuyQuantity > 10000) {
                             // 万人团
                             consumerCashback = goods.getTenThousandConsumerCashback();
                             onlineCashback = goods.getTenThousandOnlineCashback();
                             groupType = "万人团";
                         }

                         // 消费者的团销返利总额
                         if (StrUtil.isNotBlank(consumerCashback) && StrUtil.isNotBlank(groupBuyingSub.getBuyQuantity())) {
                             consumer_reward = Double.parseDouble(consumerCashback) * Double.parseDouble(groupBuyingSub.getBuyQuantity());
                             consumer_points = consumer_reward * 100.0;
                         }
                         // 线上服务商的团销返利总额
                         if (StrUtil.isNotBlank(onlineCashback) && StrUtil.isNotBlank(groupBuyingSub.getBuyQuantity())) {
                             online_reward = Double.parseDouble(onlineCashback) * Double.parseDouble(groupBuyingSub.getBuyQuantity());
                             online_points = online_reward * 100.0;
                         }
                     }

                     if (consumer_reward > 0 && consumer_points > 0) {
                         // 1.发放消费者团销返利；
                         JSONObject object = new JSONObject();
                         object.put("userId", groupBuyingSub.getPartnerId());// 消费者id
                         object.put("points", String.format("%.0f", consumer_points));// 保留0位小数
                         object.put("reason", groupBuyingSub.getGoodsName() + "团购团销返利，共" + String.format("%.2f", consumer_reward) + "元");
                         JSONObject resObj = pointsSystemApi.subPayToWallet(object);
                         if (resObj.isEmpty() || !"200".equals(resObj.getString("code"))) {
                            throw new ServiceException("给已确认收货的消费者发放团销返利失败！");
                         }

                         // 2.发送消费者团销返利通知。
                         HashMap<String, Object> params = new HashMap<>();
                         params.put("first", "亲，本场活动已结束，活动累计总销量" + totalBuyQuantity + "件，已成" + groupType + "。您参与购买" + groupBuyingSub.getBuyQuantity() + "件商品，获返现" + String.format("%.2f", consumer_reward) + "元。");
                         params.put("keyword1", groupBuyingSub.getTaskNumber());// 订单编号
                         params.put("keyword2", groupBuyingSub.getGoodsName());// 商品名称
                         params.put("remark", "点击查看收益详情。平台现有大量零食/美妆/洗护/母婴/百货等商品销售资源，佣金非常可观，欢迎前往选品！");
                         params.put("pagepath", "/pages/index/incomeIndex");// （链接到【收益页面】）
                         params.put("pageurl", "/pages/index/incomeIndex");// （链接到【收益页面】）
                         params.put("docUnid", groupBuyingSub.getId());
                         params.put("userId", groupBuyingSub.getPartnerId());
                         JSONObject obj = bpmSystemApi.sendWxMsg(params);
                         if (!"200".equals(obj.getString("code"))) {
                            throw new ServiceException("给已确认收货的消费者发送团销返利通知失败！");
                         }
                     }

                     if (!groupBuyingSub.getGoodsId().equals(groupBuyingSub.getMainDocunid())) {
                         // 如果 拼团主文档id != 商品记录唯一id，表示团长是线上服务商，需要发放线上服务商报酬
                         if (online_reward > 0 && online_points > 0) {
                             // 3.发放线上服务商团销返利；
                             JSONObject object2 = new JSONObject();
                             object2.put("userId", groupBuyingSub.getInitiatorId());// 线上服务商id
                             object2.put("points", String.format("%.0f", online_points));// 保留0位小数
                             object2.put("reason", groupBuyingSub.getGoodsName() + "团购团销返利，共" + String.format("%.2f", online_reward) + "元");
                             JSONObject resObj2 = pointsSystemApi.subPayToWallet(object2);
                             if (resObj2.isEmpty() || !"200".equals(resObj2.getString("code"))) {
                                throw new ServiceException("消费者确认收货后给线上服务商发放团销返利失败！");
                             }
                         }
                     }

                     // 4.更新“sendGroupSalesRewards = 'true'”,是否发放团销奖励(消费者/线上服务商)。true:已发放；false:未发放
                     LambdaUpdateWrapper<GroupBuyingSub> updateWrapper2 = new LambdaUpdateWrapper<>();
                     updateWrapper2.eq(GroupBuyingSub::getId, groupBuyingSub.getId());
                     updateWrapper2.set(GroupBuyingSub::getSendGroupSalesRewards, "true");
                     updateWrapper2.set(GroupBuyingSub::getUpdateTime, DateUtil.now());
                     if (!groupBuyingSubService.update(updateWrapper2)) {
                        throw new ServiceException("更新sendGroupSalesRewards字段出错了！");
                     }
                }
             }*/
        }
        log.info("执行成功！");
        log.info("********************************");
        return true;
    }

}
